home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / misc / windemo.c < prev   
Encoding:
C/C++ Source or Header  |  1994-03-20  |  11.6 KB  |  480 lines

  1. /*
  2.  * Program to demonstrate the MICRO-C/PC WINDOWING library.
  3.  *
  4.  * Copyright 1989-1994 Dave Dunfield
  5.  * All rights reserved.
  6.  *
  7.  * Permission granted for personal (non-commercial) use only.
  8.  *
  9.  * Compile command: cc windemo -fop
  10.  */
  11. #include <stdio.h>        /* Standard I/O definitions */
  12. #include <window.h>        /* Window   I/O definitions */
  13.  
  14. /* Color index's for different window types */
  15. #define    MENU    0
  16. #define    FORM    1
  17. #define    TEXT    2
  18. #define    PAUSE    3
  19.  
  20. /* Pointer to active color selections, and default values */
  21. unsigned *color,
  22.     m_colors[] = { 0x70, 0x07, 0x70, 0x07 },    /* Monochrome defaults */
  23.     c_colors[] = { 0x21, 0x17, 0x67, 0x42 };    /* Color defaults */
  24.  
  25. /* Pointer for access to title window */
  26. struct WINDOW *titlewin;
  27.  
  28. /* Introductory pre-ramble */
  29. char *intro[] = {
  30.     "",
  31.     "   This program demonstrates some of the capabilities of the MICRO-C",
  32.     "PC windowing libary. This package allows you to produce nice looking",
  33.     "DOS applications with little effort. When coupled with MICRO-C's TSR",
  34.     "function, even TSR's become simple to write... The windowing library",
  35.     "automatically saves and restores the interrupted programs video.",
  36.     "",
  37.     "   If you order the MICRO-C compiler package,  which includes complete",
  38.     "source code for the compiler,  libraries and utilities,  you will also",
  39.     "receive source code and documentation for a large selection of  useful",
  40.     "MICRO-C library functions and utility programs (Over 1 Meg total). The",
  41.     "source for the windowing library is part of that collection.",
  42.     "",
  43.     "See the included CATALOG file for ordering information.",
  44.     "",
  45.     "Enjoy MICRO-C...",
  46.     "",
  47.     "   Dave Dunfield",
  48.     "",
  49.     "Press any key to proceed...",
  50.     0 };
  51.  
  52. /* Main selection menu */
  53. char *main_menu[] = {
  54.     "Library functions",
  55.     "Window creation",
  56.     "Window scrolling",
  57.     "Concurrent windows",
  58.     "Form entry",
  59.     "OPEN attributes",
  60.     "Set window colors",
  61.     "Clear main window",
  62.     0 };
  63.  
  64. /* Colors selection menu */
  65. char *menu1[] = {
  66.     "Menu window colors",
  67.     "Form window colors",
  68.     "Text window colors",
  69.     "Pause window colors",
  70.     0 };
  71.  
  72. /* Available colors */
  73. char *menu2[] = {
  74.     "Black",
  75.     "Blue",
  76.     "Green",
  77.     "Cyan",
  78.     "Red",
  79.     "Magenta",
  80.     "Brown",
  81.     "White",
  82.     0 };
  83.  
  84. /* Sample input form */
  85. char *form[] = {
  86.     50<<8|6,
  87.     "\x01\x00\x20Software  :",
  88.     "\x01\x01\x20Author    :",
  89.     "\x01\x02\x20Directory :",
  90.     "\x01\x03\x20Filename  :",
  91.     0 };
  92.  
  93. /* Data areas for input form */
  94. char software[0x21]    = "MICRO-C",
  95.     author[0x21]    = "Dave Dunfield",
  96.     directory[0x21]    = "C:\\MC",
  97.     filename[0x21]    = "MC*.*";
  98.  
  99. /* Help text for form entry window */
  100. char *ftext[] = {
  101.     "Use ARROW keys to move around form",
  102.     "HOME/END moves to START/END of line",
  103.     "PgUp clears entire line, PgDn clears to end",
  104.     "INSERT toggles insert ON/OFF (Observe cursor)",
  105.     "DELETE deletes the character under cursor",
  106.     "BACKSPACE deletes character preceeding cursor",
  107.     "Press ESCAPE to return to the main menu",
  108.     0 }
  109.     
  110. /* Window attribute bits & corresponding defaults */
  111. char *atext[] = {
  112.     "SAVE/RESTORE screen under window",
  113.     "Enable SINGLE LINE border",
  114.     "Enable DOUBLE LINE border",
  115.     "CLEAR window on entry",
  116.     "CLEAR window on exit",
  117.     "NEWLINE(0x0A) = LF only",
  118.     "Enable SCROLLING",
  119.     "Enable LINE-WRAP" };
  120. char wattrs[8] = { 1, 1, 0, 1, 0, 0, 1, 1 };
  121.  
  122. /* Help text for attribute checkout window */
  123. char *awtext[] = {
  124.     "Use ARROW keys to move around",
  125.     "HOME = Clear entire window",
  126.     "PgUp = Clear to end of window",
  127.     "PgDn = Clear to end of line",
  128.     "ENTER = Newline character",
  129.     "ESCAPE = Return to previous menu",
  130.     0 };
  131.  
  132. /* Rambling about basic window functions (screen 1) */
  133. char *basic1[] = {        /* Screen 1 */
  134.     "",
  135.     "The basic window functions (written in assembler) are:",
  136.     "",
  137.     "   wopen        - Open a new window",
  138.     "   wclose       - Close active window",
  139.     "   wputc        - Write character to active window",
  140.     "   wclwin       - Clear active window",
  141.     "   wcleow       - Clear to end of active window",
  142.     "   wcleol       - Clear to end of line in active window",
  143.     "   w_close      - Close any window",
  144.     "   w_putc       - Write character to any window",
  145.     "   w_clwin      - Clear any window",
  146.     "   w_cleow      - Clear to end of any window",
  147.     "   w_cleol      - Clear to end of line in any window",
  148.     "",
  149.     "Press any key to proceed...",
  150.     0 };
  151.  
  152. char *basic2[] = {        /* Screen 2 */
  153.     "",
  154.     "More basic functions:",
  155.     "",
  156.     "   wgotoxy      - Position cursor in active window",
  157.     "   wupdatexy    - Update cursor position in current window",
  158.     "   wgetc        - Get character with cursor in active window",
  159.     "   wtstc        - Test for character with cursor in active window",
  160.     "   w_gotoxy     - Position cursor in any window",
  161.     "   w_updatexy   - Update cursor position in any window",
  162.     "   w_getc       - Get character with cursor in any window",
  163.     "   w_tstc       - Test for character with cursor in any window",
  164.     "   wcursor_off  - Turn cursor off *",
  165.     "   wcursor_line - Turn cursor on as a line *",
  166.     "   wcursor_block- Turn cursor on as a block *",
  167.     "",
  168.     "* The cursor is saved/restored when windows are opened/closed",
  169.     "",
  170.     "Press any key to proceed...",
  171.     0 };
  172.  
  173. /* Rambling about supplementary video functions */
  174. char *supp1[] = {
  175.     "",
  176.     "The supplementary video functions (written in 'C' are):",
  177.     "",
  178.     "   wputs        - Write a string to active window",
  179.     "   wputf        - Write a string in a field to active window",
  180.     "   wprintf      - Perform 'printf' to active window",
  181.     "   wgets        - Get a string (with editing) in active window",
  182.     "   wmenu        - Perform a multiple selection menu in window",
  183.     "   wform        - Display/update an input form in window",
  184.     "   w_puts       - Write a string to any window",
  185.     "   w_printf     - Perform 'printf' to any window",
  186.     "",
  187.     "Press any key to proceed...",
  188.     0 };
  189.  
  190. /*
  191.  * Main function, present main menu & execute sub-functions
  192.  */
  193. main()
  194. {
  195.     int m1;
  196.  
  197.     m1 = 0;
  198.  
  199.     titlewin = wopen(0, 0, 80, 3, WBOX2|WCOPEN|0x47);
  200.     color = (W_BASE == 0xB000) ? m_colors : c_colors;
  201.     wopen(0,3,80,22,WSAVE|WBOX1|WCOPEN|0x30);
  202.     wcursor_off();
  203.     title("MICRO-C Windowing Demonstration");
  204.     help(intro);
  205.     wgetc();
  206.     wclwin();
  207.     for(;;) {
  208.         title("MICRO-C Window Library Demonstration - ESC to exit");
  209.         if(wmenu(12, 5, WBOX1|WCOPEN|color[MENU], main_menu, &m1))
  210.             break;
  211.         switch(m1) {
  212.             case 0 :        /* Library function info */
  213.                 help(basic1);
  214.                 wgetc();
  215.                 help(basic2);
  216.                 wgetc();
  217.                 help(supp1);
  218.                 wgetc();
  219.                 break;
  220.             case 1 :        /* Window creation demo */
  221.                 create_demo();
  222.                 break;
  223.             case 2 :        /* Scrolling window demo */
  224.                 scroll_demo();
  225.                 break;
  226.             case 3 :        /* Concurrent window demo */
  227.                 simul_demo();
  228.                 break;
  229.             case 4 :        /* Form entry demo */
  230.                 form_demo();
  231.                 break;
  232.             case 5 :        /* Window attribute demo */
  233.                 attr_demo();
  234.                 break;
  235.             case 6 :        /* Set window colors */
  236.                 set_colors();
  237.                 break;
  238.             case 7 :        /* Clear main window */
  239.                 wclwin();
  240.                 break; } }
  241.     title("Demonstration Complete");
  242.     wclose();
  243.     wclose();
  244. }
  245.  
  246. /*
  247.  * Draw a title on the title window
  248.  */
  249. title(string)
  250.     char *string;
  251. {
  252.     w_clwin(titlewin);
  253.     w_gotoxy((78/2) - (strlen(string)/2), 0, titlewin);
  254.     w_puts(string, titlewin);
  255. }
  256.  
  257. /*
  258.  * Pause for a key to be pressed
  259.  */
  260. pause()
  261. {
  262.     wopen(22, 12, 37, 5, WSAVE|WBOX2|WCOPEN|color[PAUSE]);
  263.     wcursor_off();
  264.     wgotoxy(5, 1);
  265.     wputs("Press any key to proceed...");
  266.     wgetc();
  267.     wclose();
  268. }
  269.  
  270. /*
  271.  * Display help text on the screen
  272.  */
  273. help(text)
  274.     char *text[];
  275. {
  276.     int i;
  277.     char *ptr;
  278.  
  279.     wclwin();
  280.     i = 0;
  281.     while(ptr = text[i]) {
  282.         wgotoxy(0, i++);
  283.         wputs(ptr); }
  284. }
  285.  
  286. /*
  287.  * Set the window colors
  288.  */
  289. set_colors()
  290. {
  291.     int c, f, b;
  292.     char buffer[50];
  293.  
  294.     c = 0;
  295.     wopen(15, 9, 50, 11, WSAVE|WBOX1|WCOPEN|color[TEXT]);
  296.     wcursor_off();
  297.     wputs("Use PgUp and PgDn to select window\n\n");
  298.     wputs("Up and Down arrows to select FOREGROUND color\n");
  299.     wputs("Left and Right arrows to select BACKGROUND color\n");
  300.     wputs("Press ESCAPE to exit this function");
  301.     for(;;) {
  302.         sprintf(buffer, "COLOR selection menu: %s", menu1[c]);
  303.         title(buffer);
  304.         b = color[c] >> 4;
  305.         f = color[c] & 0x0F;
  306.         wgotoxy(0, 6);
  307.         wprintf("Foreground: %-15s", menu2[f]);
  308.         wgotoxy(0, 8);
  309.         wprintf("Background: %-15s", menu2[b]);
  310.         wopen(45, 16, 15, 3, WBOX3|WCOPEN|((b<<4)+f));
  311.         wputs("Sample window");
  312.         wclose();
  313.         switch(wgetc()) {
  314.             case _KPU :
  315.                 c = (c > 0) ? c-1 : 3;
  316.                 break;
  317.             case _KPD :
  318.                 c = (c+1) % 4;
  319.                 break;
  320.             case 0x1B:        /* Escape key */
  321.                 wclose();
  322.                 return;
  323.             case _KUA :
  324.                 f = (f > 0) ? f-1 : 7;
  325.                 goto newc;
  326.             case _KDA :
  327.                 f = (f+1) % 8;
  328.                 goto newc;
  329.             case _KLA :
  330.                 b = (b > 0) ? b-1 : 7;
  331.                 goto newc;
  332.             case _KRA :
  333.                 b = (b+1) % 8;
  334.             newc:
  335.                 color[c] = (b<<4) + f; } }
  336. }
  337.  
  338. /*
  339.  * Demo of Fast window creation
  340.  */
  341. create_demo()
  342. {
  343.     int i, j, k, l, x, y;
  344.  
  345.     title("Fast CREATION - 1000 Windows");
  346.     for(i=0; i < 1000; ++i) {
  347.         k = rand(76 - (x = rand(60)+1))+3;
  348.         l = rand(22 - (y = rand(17)+4))+3;
  349.         j = color[i%4];
  350.         wopen(x, y, k, l, WBOX1|WCOPEN|j);
  351.         wclose(); }
  352.     pause();
  353. }
  354.  
  355. /*
  356.  * Demo of scrolling window
  357.  */
  358. scroll_demo()
  359. {
  360.     int i;
  361.  
  362.     title("Example SCROLLing window");
  363.     wopen(15, 9, 50, 10, WSAVE|WBOX1|WCOPEN|WSCROLL|WWRAP|color[TEXT]);
  364.     wcursor_off();
  365.     for(i=0; i <= 5000; ++i)
  366.         wprintf("%-6u", i);
  367.     pause();
  368.     wclose();
  369. }
  370.  
  371. /*
  372.  * Demo of an input form
  373.  */
  374. form_demo()
  375. {
  376.     title("Example FORM entry");
  377.     wopen(15, 16, 50, 9, WSAVE|WBOX3|color[TEXT]);
  378.     help(ftext);
  379.     wform(15, 9, WSAVE|WBOX1|WCOPEN|color[FORM], form, software, author,
  380.         directory, filename);
  381.     wclose();
  382. }
  383.  
  384. /*
  385.  * Demo concurrent window access
  386.  */
  387. simul_demo()
  388. {
  389.     int i;
  390.     struct WINDOW *w1, *w2, *w3, *w4;
  391.  
  392.     title("Multiple CONCURRENT open windows");
  393.  
  394.     w1 = wopen(10, 06, 20, 8, WSAVE|WCOPEN|WSCROLL|WWRAP|color[FORM]);
  395.     w2 = wopen(50, 06, 20, 8, WSAVE|WBOX1|WCOPEN|WSCROLL|WWRAP|color[PAUSE]);
  396.     w3 = wopen(10, 15, 20, 8, WSAVE|WBOX2|WCOPEN|WSCROLL|WWRAP|color[TEXT]);
  397.     w4 = wopen(50, 15, 20, 8, WSAVE|WBOX3|WCOPEN|WSCROLL|WWRAP|color[MENU]);
  398.     wcursor_off();
  399.     for(i=0; i < 1000; ++i) {
  400.         w_printf(w1, "\n%u", i);
  401.         w_printf(w2, "\n%b", i);
  402.         w_printf(w3, "\n%o", i);
  403.         w_printf(w4, "\n%x", i); }
  404.  
  405.     pause();
  406.     wclose();
  407.     wclose();
  408.     wclose();
  409.     wclose();
  410. }
  411.  
  412. /*
  413.  * Demo of window attributes (for "wopen")
  414.  */
  415. attr_demo()
  416. {
  417.     unsigned i, attrs, x, y;
  418.  
  419.     title("Window OPEN attributes");
  420.     wopen(10, 6, 60, 12, WSAVE|WBOX1|WCOPEN|color[TEXT]);
  421.     wcursor_off();
  422.     wputs("Select Attributes, ENTER=window, ESCAPE=exit");
  423.     for(i=0; i < 8; ++i) {
  424.         wgotoxy(1, i+2);
  425.         wprintf("%u - XXX - %s\n", i+1, atext[i]); }
  426.     for(;;) {
  427.         for(i=0; i <8; ++i) {
  428.             wgotoxy(5, i+2);
  429.             wputs(wattrs[i] ? "ON " : "OFF"); }
  430.         switch(i = wgetc()) {
  431.             case 0x1B:
  432.                 wclose();
  433.                 return;
  434.             case '\n' :
  435.                 attrs = 0;
  436.                 for(i=0; i < 8; ++i)
  437.                     attrs = (attrs << 1) | wattrs[i];
  438.                 wopen(42, 17, 34, 8, WSAVE|WBOX3|color[PAUSE]);
  439.                 help(awtext);
  440.                 wopen(48, 10, 20, 6, (attrs << 8) | color[FORM]);
  441.                 wcursor_line();
  442.                 while((i = wgetc()) != 0x1B) {
  443.                     x = W_OPEN->WINcurx;
  444.                     y = W_OPEN->WINcury;
  445.                     switch(i) {
  446.                         case _KUA:
  447.                             wgotoxy(x, y-1);
  448.                             break;
  449.                         case _KDA:
  450.                             wgotoxy(x, y+1);
  451.                             break;
  452.                         case _KRA:
  453.                             wgotoxy(x+1, y);
  454.                             break;
  455.                         case _KLA:
  456.                             wgotoxy(x-1, y);
  457.                             break;
  458.                         case _KHO:
  459.                             wclwin();
  460.                             break;
  461.                         case _KPU:
  462.                             wcleow();
  463.                             break;
  464.                         case _KPD:
  465.                             wcleol();
  466.                             break;
  467.                         case _KBS:
  468.                             i = 8;
  469.                         default:
  470.                             wputc(i); } }
  471.                 wclose();
  472.                 wclose();
  473.                 break;
  474.             default:
  475.                 if((i -= '1') < 8) {
  476.                     wattrs[i] = !wattrs[i];
  477.                     break; }
  478.                 wputc(7); } }
  479. }
  480.